package com.hexb.llk.data
{
	import com.hexb.llk.arithmetic.BaseConnectArithmetic;
	import com.hexb.llk.face.IElementCreator;
	import com.hexb.llk.face.IElementLayout;
	import com.hexb.llk.face.IElementRemove;
	import com.hexb.llk.impl.ConnectArithmeticWithSnapshot;

	public class BaseSnapshot{
		
		//1.连接算法
		protected var arithmetic:ConnectArithmeticWithSnapshot ;//用于计算连接的算法
		
		//2.消除后移动策略
		protected var remover:IElementRemove ;
		
		//3.随机产生元素策略
		protected var creator:IElementCreator ;
		
		//4.布局策略
		protected var layout:IElementLayout ;
		
		/**===================================*/
		
		//Array<Element>
		protected var elements:Array ;
		//布局的二维数组
		protected var snapshot:Array ;
		
		/**===================================*/
		
		/**
		 * @param typeNum 元素种类数量
		 * @param eleNum 元素个数（偶数）
		 * */
		public function BaseSnapshot(typeNum:int,eleNum:int){
			arithmetic = ConnectArithmeticWithSnapshot.getInstance();
			
			init(typeNum,eleNum);
		}
		
		/**计算两点连接时计算*/
		public function process(ele1:Element,ele2:Element):Boolean{
			if(arithmetic.hasConnectPath(ele1,ele2,this)){
				remover.removeElement(ele1,ele2,this);
				return true ;
			}
			return false ;
		}
		
		/**重新刷新布局*/
		public function refresh():void{
			layout.layoutNotFullElements(elements,this);
		}
		
		public function getLayout():Array{
			return snapshot ;
		}
		
		//以下方法需要子类重写
		
		/**返回当前位置是否可以布置元素*/
		protected function canLayoutThis(x:int,y:int):Boolean ;
		
		
		//
		private function init(typeNum:int,eleNum:int):void{
			elements = creator.createElements(typeNum,eleNum) ;
			layout.layoutFullElements(elements,this);
		}
	}
}